use rand::Rng; // 引入随机数生成 trait

/** # 骰子游戏
掷双骰子游戏是赌场中非常流行的游戏。编写程序玩这个游戏的一个变种，具体：

- 掷两个骰子，每个骰子有六面，分别表示1，2，……，6。检查这两个骰子的和。
    - 如果和为2、3或12，你就输了；
    - 如果和是7或者11，你就赢了；
- 但如果和是其他数，就确定了一个点，继续掷骰子，直到掷出一个7或者掷出和刚才相同的点数。
    - 如果掷出的是7，你就输了；
    - 如果掷出的点数和你前一次掷出的点数相同，你就赢了。*/
pub fn dice_game() {
    start_game();
}

/** # 开始游戏 */
fn start_game() {
    println!("\n⭐️ 开始第 1 轮投掷：");
    let first_throw = throw();

    match first_throw {
        2 | 3 | 12 => println!("❌ 结果为2/3/12，很遗憾您输了。"),
        7 | 11 => println!("✅ 结果为7/11，恭喜获胜！"),
        _ => comparison(first_throw, 2),
    }
}

/** 对比点数 */
fn comparison(expected: u8, count: u32) {
    println!("\n⭐️ 开始第 {count} 轮投掷：");
    let throw = throw();

    if throw == 7 {
        println!("❌ 结果为7，很遗憾您输了。");
    } else if throw == expected {
        println!("✅ 您的第一次投掷结果是{expected}，结果一致，恭喜获胜！");
    } else {
        println!("♾️ 您的第一次投掷结果是{expected}，结果不一致，本次为平局！");
        // 递归执行当前方法
        comparison(expected, count + 1);
    }
}

/** # 投掷
- 生成两个1~6的随机索引，代表两次骰子骰子的结果
- 两个值的结果相加并返回，代表本次投掷结果
*/
fn throw() -> u8 {
    let dice1 = rand::rng().random_range(1..=6);
    let dice2 = rand::rng().random_range(1..=6);

    let sum = dice1 + dice2;
    println!("🎲 本次投掷结果：{dice1} + {dice2} = {sum}");

    sum
}
